package com.doumuxie.handler;

import com.doumuxie.dto.ProcessDto;
import com.doumuxie.frame.ChildFrame;
import com.doumuxie.util.DataUtil;
import com.doumuxie.util.SysCode;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * @author doumuxie https://gitee.com/doumuxie/
 * @version 1.0
 * @date 2020/9/26 9:04
 * @description 线程相关处理
 **/
public class ProcessHandler {

    /**
     * 用于保存所有的线程实体
     */
    public static List<ProcessDto> list = new ArrayList<>();

    /**
     * 正在运行的线程id
     */
    public static String runningProcessId;


    /**
     * 添加线程 自动排序
     *
     * @param dto
     */
    public static void add(ProcessDto dto) {
        list.add(dto);
        sort();
    }

    /**
     * 删除线程 自动排序
     *
     * @param dto
     */
    public static void remove(ProcessDto dto) {
        list.remove(dto);
        sort();
    }

    /**
     * 根据优先级排序
     */
    public static void sort() {
        Collections.sort(list);
    }

    /**
     * 获取指定线程数据
     *
     * @param index 索引
     * @return
     */
    public static ProcessDto get(int index) {
        if (index >= list.size() || index < 0) {
            return null;
        }
        return ProcessHandler.list.get(index);
    }

    /**
     * 获取指定线程数据
     *
     * @param id 线程id
     * @return
     */
    public static ProcessDto get(String id) {
        for (ProcessDto dto : list) {
            if (id.equals(dto.getId())) {
                return dto;
            }
        }
        return null;
    }

    /**
     * 更新全部列表数据
     *
     * @param frame
     */
    public static void initRowData(ChildFrame frame) {
        try {
            String[][] rowData = DataUtil.toArray(ProcessHandler.list);
            frame.getModelOne().setRowCount(0);
            for (int i = 0; i < rowData.length; i++) {
                frame.getModelOne().addRow(new Object[]{});
                String[] rowDatum = rowData[i];
                for (int j = 0; j < 6; j++) {
                    frame.getTableOne().setValueAt(rowDatum[j], i, j);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.err.println("===========异常===========");
        }
    }

    /**
     * 更新行数据
     *
     * @param id    线程id
     * @param data  数据值
     * @param frame frame
     */
    public static void updateRowData(String id, int data, ChildFrame frame) {
        for (int i = 0; i < ProcessHandler.list.size(); i++) {
            if (ProcessHandler.list.get(i).getId().equals(id)) {
                frame.getTableOne().setValueAt(data, i, 5);
            }
        }
    }

    /**
     * 执行下一个线程
     *
     * @param id 跳过的线程id
     */
    public static void nextProcess(String id) {
        if (list.size() < 1) {
            return;
        }
        ProcessDto process = null;
        for (ProcessDto dto : list) {
//            SysCode.PROCESS_STATE.BLOCK.equals(dto.getState()) ||
            if (SysCode.PROCESS_STATE.NEW.equals(dto.getState())) {
                if (dto.getId().equals(id)) {
                    continue;
                }
                process = dto;
                break;
            }
        }
        if (process == null) {
            return;
        }
        Thread thread = process.getThread();
        if (Thread.State.NEW.equals(thread.getState())) {
            thread.start();
        }
        ProcessHandler.runningProcessId = process.getId();
        process.setRun(true);
        process.setState(SysCode.PROCESS_STATE.RUN);
    }

}
